package org.credo.io;

import java.io.FileReader;
import java.io.IOException;
import java.io.PushbackReader;

/**
 * <p>Description: 下面程序试图找到new PushbackReader的字符串,找到后只打出这个字符之前的内容,找不到全打.</p>
 * @author <a href="zhaoqianjava@qq.com">Credo</a>
 */
public class PushbackTest {

	public static void main(String[] args) throws IOException {
		//创建一个PushbackReader对象,指定推回缓冲区的长度为64.
		PushbackReader pr=new PushbackReader(new FileReader("D://test.txt"), 64);
		char[] buf=new char[32];
		//用于保存上次读取的字符串内容
		String lastContent="";
		int hasRead=0;
		//循环读取文件内容
		while ((hasRead=pr.read(buf))>0) {
			//将读取到内容转换成字符串
			String content=new String(buf,0,hasRead);
			int targetIndex=0;
			//将上次读取的字符串和本次读取的字符串拼起来
			//查看是否包含目标字符串,如果包含目标字符串
			if((targetIndex=(lastContent+content).indexOf("new PushbackReader"))>0){
				//将本次内容和上次内容一起推回缓冲区
				pr.unread((lastContent+content).toCharArray());
				//指定提取前面的len个字符
				int len=targetIndex>32?32:targetIndex;
				//再次读取指定长度的内容(就是目标字符串之前的内容)
				pr.read(buf,0,len);
				//打印读取的内容
				System.out.println(new String(buf,0,len));
				System.exit(0);
				
				//上述代码实现了将制定内容推回到推回缓冲区,于是当程序再次调用read()方法时,
				//实际上只是读取了推回缓冲区的部分内容,从而实现了只打印目标字符串前面内容的功能.
			}
			else{
				//打印上次读取的内容
				System.out.println(lastContent);
				//将本次内容设为上次读取的内容.
				lastContent=content;
			}
		}
		pr.close();
	}
}
